/**
 * Copyright (C), 2022-2025, www.bosssof.com.cn
 * @FileName RoleApi.java
 * @Author hantianbing
 * @Date 2022-12-9
 * @Description 文件定义了角色的管理接口，包括角色增 删 改查 以及角色分配资源
 * History:
 * <author> hantianbing
 * <time> 2022-12-9
 * <version> 1.0.0
 * <desc> 文件定义了角色的管理接口，包括角色增 删 改查 以及角色分配资源
 */
package com.sd365.permission.centre.api;

import com.sd365.common.log.api.annotation.ApiLog;
import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.RoleCompanyDTO;
import com.sd365.permission.centre.pojo.dto.RoleDTO;
import com.sd365.permission.centre.pojo.dto.RoleResourceDTO;
import com.sd365.permission.centre.pojo.dto.UserRoleDTO;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.RoleCompanyVO;
import com.sd365.permission.centre.pojo.vo.RoleVO;
import com.sd365.permission.centre.pojo.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * @Class RoleApi
 * @Description RoleController层接口。
 * <br>主要方法为 角色分配资源（assignResource）和角色分配用户（assignUser）
 * <br>其他方法较为常规主要是针对角色的增删改查
 * @Author hantianbing
 * @Date 2022-12-9
 * @version 1.0.0
 */
@CrossOrigin
@Api(tags = "角色管理 ", value = "/permission/centre/v1/role")
@RequestMapping(value = "/permission/centre/v1/role")
public interface RoleApi {

    /***
     * @Description 在系统启动时候将初始化角色和资源的关系，主要为网关鉴权服务
     * @param role 角色
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:19
     * @Author hantianbing
     **/
    @GetMapping(value = "/initRoleResourceRedis")
    Boolean initRoleResourceRedis(Role role);

    /***
     * @Description 为多个角色分配多资源
     * @param roleResourceDTO 前端勾选的角色和资源
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:20
     * @Author hantianbing
     **/
    @ApiOperation(tags = "为多角色分配多资源", value = "")
    @PostMapping(value = "/assignResource")
    @ResponseBody
    Boolean assignResource(@Valid @RequestBody RoleResourceDTO roleResourceDTO);

    /***
     * @Description 为多角色分配多用户
     * @param userRoleDTO   前端勾选的角色和用户
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:21
     * @Author hantianbing
     **/
    @ApiOperation(tags = "为多角色分配多用户", value = "")
    @PostMapping(value = "/assignUser")
    @ResponseBody
    Boolean assignUser(@Valid @RequestBody UserRoleDTO userRoleDTO);


    /***
     * @Description 查看角色的通过角色id获取该角色拥有的资源,角色界面未发起对该方法考虑非在角色管理模块
     * @param roleQuery 支持传入id和名字 建议参数和名字保持一致有待改进
     * @return java.util.List<com.sd365.permission.centre.entity.Node>
     * @Date 2022/12/29 18:45
     * @Author hantianbing
     **/
    @ApiOperation(tags = "根据roleId查询角色分配的资源", value = "")
    @PostMapping(value = "/resource")
    @ResponseBody
    @Deprecated
    List<Node> doQueryResourceByRoleId(@Valid @RequestBody RoleQuery roleQuery);

    /***
     * @Description 查询公司， 公司这个功能暂时没有开发
     * @return java.util.List<com.sd365.permission.centre.entity.Node>
     * @Date 2022/12/29 14:22
     * @Author hantianbing
     **/
    @ApiOperation(tags = "查询角色表中包含的公司", value = "")
    @GetMapping(value = "/selectCompany")
    @ResponseBody
    List<Node> selectCompany();

    /***
     * @Description 查询角色是否存在
     * @param roleDTO 查询的角色的信息
     * @return boolean 存在true， 不存在false
     * @Date 2022/12/29 14:23
     * @Author hantianbing
     **/
    @ApiOperation(tags = "验证角色是否重复", value = "")
    @PostMapping(value = "/haveName")
    @ResponseBody
    boolean haveRole(@RequestBody @Valid RoleDTO roleDTO);

    /***
     * @Description 增加角色，同是也是复制的接口
     * @param roleDTO   要增加的角色
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:23
     * @Author hantianbing
     **/
    @ApiOperation(tags = "增加角色", value = "")
    @PostMapping(value = "")
    @ResponseBody
    Boolean add(@RequestBody @Valid RoleDTO roleDTO);


    /***
     * @Description 删除角色 ，需要角色id， 版本
     * @param id        角色id
     * @param version   角色版本
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:24
     * @Author hantianbing
     **/
    @ApiOperation(tags = "删除角色", value = "")
    @DeleteMapping(value = "")
    @ResponseBody
    Boolean remove(@ApiParam(value = "当前行id", required = true) @RequestParam("id") Long id,
                   @ApiParam(value = "当前行版本", required = true) @RequestParam("version") Long version);


    /***
     * @Description 批量删除角色，同时删除相关联的信息
     * @param roleDTOS  要删除的角色
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:26
     * @Author hantianbing
     **/
    @ApiOperation(tags = "批量删除角色", value = "")
    @DeleteMapping(value = "/batch")
    @ResponseBody
    Boolean batchRemove(@RequestBody @Valid RoleDTO[] roleDTOS);


    /***
     * @Description 修改角色信息
     * @param roleDTO   要修改的角色， 通过角色id识别角色
     * @return com.sd365.permission.centre.pojo.dto.RoleDTO
     * @Date 2022/12/29 14:27
     * @Author hantianbing
     **/
    @ApiOperation(tags = "修改角色", value = "")
    @PutMapping(value = "")
    @ResponseBody
    RoleDTO modify(@RequestBody @Valid RoleDTO roleDTO);


    /***
     * @Description 复制角色， 此项目中没有用到当前接口
     * @param id  要复制的角色id
     * @return com.sd365.permission.centre.pojo.dto.RoleDTO
     * @Date 2022/12/29 14:28
     * @Author hantianbing
     **/
    @ApiOperation(tags = "拷贝角色", value = "/copy")
    @PostMapping(value = "/copy")
    @ResponseBody
    RoleDTO copy(Long id);

    /***
     * @Description 查询角色， 可以通过角色姓名、工号信息模糊查询角色
     * @param roleQuery 要查询的角色的信息
     * @return java.util.List<com.sd365.permission.centre.pojo.vo.RoleVO>
     *     查询的结果返回
     * @Date 2022/12/29 14:29
     * @Author hantianbing
     **/
    @ApiOperation(tags = "查询角色", value = "")
    @GetMapping(value = "")
    @ResponseBody
    @ApiLog
    List<RoleVO> commonQuery(RoleQuery roleQuery);


    /***
     * @Description 查询用户，可以根据用户的姓名，code等信息模糊查询用户
     * @param userQuery 要查询的用户的部分信息
     * @return java.util.List<com.sd365.permission.centre.pojo.vo.UserVO>
     * @Date 2022/12/29 14:31
     * @Author hantianbing
     **/
    @ApiOperation(tags = "查询用户", value = "")
    @GetMapping(value = "/commonQueryUser")
    @ResponseBody
    @ApiLog
    List<UserVO> commonQueryUser(UserQuery userQuery);


    /***
     * @Description 通过角色的id查询角色
     * @param id    角色的id
     * @return com.sd365.permission.centre.pojo.vo.RoleVO
     * @Date 2022/12/29 14:31
     * @Author hantianbing
     **/
    @ApiOperation(tags = "查询角色 BY ID", value = "")
    @GetMapping(value = "{id}")
    @ResponseBody
    RoleVO queryRoleById(@PathVariable("id") Long id);


    /***
     * @Description todo 通过用户的id， 查询出所有该用户的所有权限
     * @param id 用户的id
     * @return com.sd365.permission.centre.pojo.vo.RoleVO
     * @Date 2022/12/29 14:32
     * @Author hantianbing
     **/
    @ApiOperation(tags = "查询用户资源 BY ID", value = "")
    @GetMapping(value = "/queryUserResource")
    @ResponseBody
    RoleVO queryUserResource(@RequestParam(value = "id", required = true) Long id);


    /***
     * @Description 通过id查询角色公司关系，培训项目不要求实现功能点
     * @param id  角色id
     * @return com.sd365.permission.centre.pojo.vo.RoleCompanyVO
     * @Date 2022/12/29 14:34
     * @Author hantianbing
     **/
    @ApiOperation(tags = "通过id查询角色公司关系", value = "/company")
    @GetMapping(value = "/company")
    @ResponseBody
    RoleCompanyVO queryRoleCompanyById(@RequestParam(value = "id") Long id);


    /***
     * @Description todo 修改角色公司关系
     * @param roleCompanyDTO  角色公司对应信息
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:36
     * @Author hantianbing
     **/
    @ApiOperation(tags = "修改角色公司关系", value = "/company")
    @PutMapping(value = "/company")
    @ResponseBody
    Boolean modifyRoleCompany(@RequestBody @Valid RoleCompanyDTO roleCompanyDTO);
}
